package parsing;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit.ParserCallback;

public class CustomHomePageParser extends ParserCallback {
	
	private int countTable = 0; // Nombre de <table> inclu l'un dans l'autre
	
	// Flag pour indiquer qu'on veut le prochain Text qu'on trouvera
	private boolean theNextTextIsTheDomaine = false;
	private boolean theNextTextIsTheFamille = false;
	private boolean theNextTextIsTheGenome = false;
	
	private String domaineCourant = null; 	 // Domaine (entre Eukarya,Archaea,Bacteria)
	private String familleCourante = null; 	 // Famille du génome
	private String genomeCourant = null; 	 // Nom du génome
	private String genomeCourantURL = null; // URL de la page du génome
	
	//Ensemble à remplir de génomes
	private Map<String,List<Genome>> bioinfo;
	
	public CustomHomePageParser(Map<String,List<Genome>> bioinfo) {
		this.bioinfo = bioinfo;
	}
	
	/** Exécuté lorsqu'il y a du texte
	 * @see javax.swing.text.html.HTMLEditorKit.ParserCallback#handleText(char[], int)
	 */
	public void handleText(char[] data, int pos) {
		if (theNextTextIsTheDomaine) { // Texte du nom de domaine
			theNextTextIsTheDomaine = false;
			//System.out.println("Domaine:"+new String(data));
			domaineCourant = new String(data);
			this.bioinfo.put(domaineCourant, new ArrayList<Genome>());
		}
		if (theNextTextIsTheFamille) { // Texte du nom de famille
			theNextTextIsTheFamille=false;
			//System.out.println("\tFamille:"+new String(data));
			familleCourante = new String(data);
		}
		if (theNextTextIsTheGenome) { // Texte du nom du génome
			theNextTextIsTheGenome=false;
			//System.out.println("\t\tGenome:"+new String(data));
			genomeCourant = new String(data);
			this.bioinfo.get(domaineCourant).add(new Genome(familleCourante, genomeCourant, genomeCourantURL));
		}
	}
	
	/** Exécuté au début d'une balise
	 * @see javax.swing.text.html.HTMLEditorKit.ParserCallback#handleStartTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet, int)
	 */
	public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
		// Pour obtenir le nom de domaine :
		// Balise A avec une <table> de récurrence 1 non null et différente de "top"
		if (t.equals(HTML.Tag.A) && countTable==1 && a.getAttribute(HTML.Attribute.NAME)!=null && !a.getAttribute(HTML.Attribute.NAME).equals("top")) {
			theNextTextIsTheDomaine = true;
		}
		// Pour obtenir le nom de la famille
		// Nom du domaine non vide et une balise A et une <table> de récurrence 2 et non null
		else if (domaineCourant!=null && t.equals(HTML.Tag.A) && countTable==2 && a.getAttribute(HTML.Attribute.NAME)!=null) {
			theNextTextIsTheFamille=true;
		}
		// Pour obtenir le nom du génome
		// Nom de famille non vide et une balise A et une <table> de récurrence 1
		else if (familleCourante!=null && t.equals(HTML.Tag.A) && countTable==1) {
			genomeCourantURL = a.getAttribute(HTML.Attribute.HREF).toString(); // URL du Génome
			theNextTextIsTheGenome=true;
		}
		
		if (t.equals(HTML.Tag.TABLE)) {
			// J'incremte les <table> qui sont un dans l'autre
			countTable++;
		}
	}
	
	/** Exécuté à la fin d'une balise
	 * @see javax.swing.text.html.HTMLEditorKit.ParserCallback#handleEndTag(javax.swing.text.html.HTML.Tag, int)
	 */
	public void handleEndTag(HTML.Tag t, int pos) {
		if (t.equals(HTML.Tag.TABLE)) {
			// Je décremente  les <table> qui sont un dans l'autre
			countTable--;
		}
	}
}